home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 April: Mac OS SDK / Dev.CD Apr 98 SDK2.toast / Development Kits (Disc 2) / QuickTime / Programming Stuff / Documentation / develop articles / develop Issue 23 / Internet Config / IC 1.1 / ICAppSourceKit1.1 / ICFontWhats.p < prev    next >
Encoding:
Text File  |  1997-02-26  |  8.2 KB  |  289 lines  |  [TEXT/PJMM]

  1. unit ICFontWhats;
  2.  
  3. interface
  4.  
  5.     uses
  6.         ICWindowGlobals;
  7.  
  8.     function WhatOpenFont (wt: WindowType; item: integer): OSErr;
  9.     function WhatFlushFont (wt: WindowType; item: integer): OSErr;
  10.     function WhatClickFont (wt: WindowType; item: integer; er: eventRecord): OSErr;
  11.     function WhatClickFontSize (wt: WindowType; item: integer; er: eventRecord): OSErr;
  12.  
  13. implementation
  14.  
  15.     uses
  16.         Script, 
  17.  
  18.         ICStrH, 
  19.  
  20.         ICKeys, ICAPI, ICDialogs, ICMiscSubs, ICSubs, ICDocUtils, ICMovableModal;
  21.  
  22.     procedure SetSizeOutlines (sizemenu: MenuHandle; font_num: integer);
  23.         var
  24.             tmpstr: Str255;
  25.             i: integer;
  26.             the_size: longint;
  27.     begin
  28.         for i := 1 to CountMItems(sizemenu) do begin
  29.             GetItem(sizemenu, i, tmpstr);
  30.             StringToNum(tmpstr, the_size);
  31.             if RealFont(font_num, the_size) then begin
  32.                 SetItemStyle(sizemenu, i, [outline]);
  33.             end
  34.             else begin
  35.                 SetItemStyle(sizemenu, i, []);
  36.             end; (* if *)
  37.         end; (* for *)
  38.     end; (* SetSizeOutlines *)
  39.  
  40.     function FindMenuItem (mh: MenuHandle; item: Str255; var index: integer): boolean;
  41.         var
  42.             i: integer;
  43.             test_name: Str255;
  44.     begin
  45.         FindMenuItem := false;
  46.         for i := 1 to CountMItems(mh) do begin
  47.             GetItem(mh, i, test_name);
  48.             if IUEqualString(test_name, item) = 0 then begin
  49.                 index := i;
  50.                 FindMenuItem := true;
  51.             end; (* if *)
  52.         end; (* for *)
  53.     end;
  54.  
  55.     function ValidateSize (size: longInt): longInt;
  56.     begin
  57.         if (size > 0) and (size < 32767) then begin
  58.             ValidateSize := size;
  59.         end
  60.         else begin
  61.             ValidateSize := GetDefFontSize;
  62.         end; (* if *)
  63.     end;
  64.  
  65.     function GetSizeMenuValue (dlg: DialogPtr; item: integer): longInt;
  66.         var
  67.             tmpstr: Str255;
  68.             tmpint: longint;
  69.             sizemenu: MenuHandle;
  70.     begin
  71.         sizemenu := GetPopupMHandle(dlg, item);
  72.         GetItem(sizemenu, GetDCtlValue(dlg, item), tmpstr);
  73.         StringToNum(tmpstr, tmpint);
  74.         GetSizeMenuValue := ValidateSize(tmpint);
  75.     end;
  76.  
  77.     procedure GetCurrentSetting (dlg: DialogPtr; item: integer; var font_setting: ICFontRecord; var font_num: integer);
  78.     begin
  79.         font_setting.face := [];
  80.         GetItem(GetPopupMHandle(dlg, item), GetDCtlValue(dlg, item), font_setting.font);
  81.         GetFNum(font_setting.font, font_num);
  82.         font_setting.size := GetSizeMenuValue(dlg, item + 1);
  83.     end;
  84.  
  85.     procedure DisplayFontProc (dlg: DialogPtr; item: integer);
  86.         var
  87.             font_setting: ICFontRecord;
  88.             saved: SavedWindowInfo;
  89.             font: integer;
  90.             r: rect;
  91.             s: str255;
  92.             name: Str255;
  93.     begin
  94.         SetPort(dlg);
  95.         GetCurrentSetting(dlg, item - 2, font_setting, font);
  96.         EnterWindow(dlg, font, font_setting.size, [], saved);
  97.         GetDItemRect(dlg, item, r);
  98.         PenPat(gray);
  99.         FrameRect(r);
  100.         PenPat(black);
  101.         GetFontName(font, name);
  102.         if (name = 'Chicago') & ((font_setting.size <> 12) | (item = 9)) then begin
  103.             s := GetIndStr(128, 16);
  104.         end
  105.         else begin
  106.             s := GetIndStr(128, 14);
  107.         end; (* if *)
  108.         InsetRect(r, 3, 3);
  109.         TextBox(@s[1], length(s), r, teJustLeft);
  110.         ExitWindow(saved);
  111.     end;
  112.  
  113.     function WhatOpenFont (wt: WindowType; item: integer): OSErr;
  114.         var
  115.             dlg: WindowPtr;
  116.             fontmenu: MenuHandle;
  117.             sizemenu: MenuHandle;
  118.             font_setting: ICFontRecord;
  119.             attr: longint;
  120.             i: integer;
  121.             tmpstr: Str255;
  122.             test_name: Str255;
  123.             count: longint;
  124.             font_num: integer;
  125.     begin
  126.         dlg := windowinfo[wt].window;
  127.         fontmenu := GetPopupMHandle(dlg, item);
  128.         count := sizeof(font_setting);
  129.         if (ICMapErr(ICGetPref(GetInstance, windowinfo[wt].items[item]^.key, attr, @font_setting, count)) <> noErr) | (count <> sizeof(font_setting)) then begin
  130.             GetFontName(GetAppFont, font_setting.font);
  131.             font_setting.face := [];
  132.             font_setting.size := GetDefFontSize;
  133.         end; (* if *)
  134.         ProcessAttributes(wt, item, attr);
  135.         GetFNum(font_setting.font, font_num);
  136.         if font_num = 0 then begin
  137.             GetFontName(GetAppFont, font_setting.font);
  138.             GetFNum(font_setting.font, font_num);
  139.         end; (* if *)
  140.         if FindMenuItem(fontmenu, font_setting.font, i) then begin
  141.             SetDCtlValue(dlg, item, i);
  142.         end;
  143.         NumToString(font_setting.size, tmpstr);
  144.         sizemenu := GetPopupMHandle(dlg, item + 1);
  145.         if FindMenuItem(sizemenu, tmpstr, i) then begin
  146.             SetDCtlValue(dlg, item + 1, i);
  147.         end;
  148.         windowinfo[wt].items[item + 1]^.spare_data := ptr(font_setting.size);
  149.         SetSizeOutlines(sizemenu, font_num);
  150.         SetDCtlEnable(dlg, item, not IsLocked(wt, item));
  151.         SetDCtlEnable(dlg, item + 1, not IsLocked(wt, item));
  152.         SetDItemHandle(dlg, item + 2, handle(@DisplayFontProc));
  153.         WhatOpenFont := noErr;
  154.     end; (* WhatOpenFont *)
  155.  
  156.     function WhatClickFont (wt: WindowType; item: integer; er: eventRecord): OSErr;
  157.         var
  158.             dlg: DialogPtr;
  159.             font_setting: ICFontRecord;
  160.             font_num: integer;
  161.     begin
  162.         dlg := windowinfo[wt].window;
  163.         GetCurrentSetting(dlg, item, font_setting, font_num);
  164.         SetSizeOutlines(GetPopupMHandle(dlg, item + 1), font_num);
  165.         DisplayFontProc(dlg, item + 2);
  166.         WhatClickFont := noErr;
  167.     end;  (* WhatClickFont *)
  168.  
  169.     function MyModalFilter (dlg: DialogPtr; var er: EventRecord; var item: integer): boolean;
  170.         const
  171.             bs = chr(8);
  172.         var
  173.             ch: char;
  174.     begin
  175.         MyModalFilter := false;
  176.         if CancelModalFilter(dlg, er, item) then begin
  177.             MyModalFilter := true;
  178.         end
  179.         else if (er.what = keyDown) or (er.what = autoKey) then begin
  180.             if BAND(er.modifiers, cmdKey) = 0 then begin
  181.                 ch := chr(BAND(er.message, $FF));
  182.                 if DirtyKey(ch) & not (ch in [bs, '0'..'9']) then begin
  183.                     SysBeep(1);
  184.                     er.what := nullEvent;
  185.                 end;
  186.             end;
  187.         end;
  188.     end;
  189.  
  190.     function GetOtherSize (var size: longInt): boolean;
  191.         var
  192.             dlg: DialogPtr;
  193.             item: integer;
  194.             s: Str255;
  195.             saved_state: Ptr;
  196.     begin
  197.         dlg := GetNewDialog(500, nil, POINTER(-1));
  198.         NumToString(size, s);
  199.         SetItemText(dlg, 4, s);
  200.         SelIText(dlg, 4, 0, 255);
  201.         SetUpDefaultOutline(dlg, 1, 3);
  202.         ShowWindow(dlg);
  203.         DisableMenuBar(saved_state, -1);
  204.         InitCursor;
  205.         repeat
  206.             MovableModalDialog(@MyModalFilter, item);
  207.         until item in [1, 2];
  208.         GetOtherSize := item = 1;
  209.         if item = 1 then begin
  210.             GetItemText(dlg, 4, s);
  211.             StringToNum(s, size);
  212.             size := ValidateSize(size);
  213.         end;
  214.         ReEnableMenuBar(saved_state);
  215.         DisposeDialog(dlg);
  216.     end;
  217.  
  218.     function WhatClickFontSize (wt: WindowType; item: integer; er: eventRecord): OSErr;
  219.         var
  220.             dlg: DialogPtr;
  221.             control: ControlHandle;
  222.             sizemenu: MenuHandle;
  223.             n: longInt;
  224.             tmpstr: Str255;
  225.             i: integer;
  226.             dummy: boolean;
  227.     begin
  228.         dlg := windowinfo[wt].window;
  229.         control := GetDControlHandle(dlg, item);
  230.         sizemenu := GetPopupMHandle(dlg, item);
  231.         if GetCtlValue(control) = CountMItems(sizemenu) then begin
  232.             n := ord(windowinfo[wt].items[item]^.spare_data);
  233.             dummy := GetOtherSize(n);
  234.         end
  235.         else begin
  236.             n := GetSizeMenuValue(dlg, item);
  237.         end;
  238.         if not BTST(sizemenu^^.enableFlags, 2) then begin { has initial strange number }
  239.             DelMenuItem(sizemenu, 1);
  240.             DelMenuItem(sizemenu, 1);
  241.         end;
  242.         windowinfo[wt].items[item]^.spare_data := Ptr(n);
  243.         NumToString(n, tmpstr);
  244.         if not FindMenuItem(sizemenu, tmpstr, i) then begin
  245.             InsMenuItem(sizemenu, '(-;fred', 0);
  246.             SetItem(sizemenu, 1, tmpstr);
  247.             i := 1;
  248.         end;
  249.         SetCtlMax(control, CountMItems(sizemenu));
  250.         SetCtlValue(control, i);
  251.         DisplayFontProc(windowinfo[wt].window, item + 1);
  252.         WhatClickFontSize := noErr;
  253.     end;
  254.  
  255.     function WhatFlushFont (wt: WindowType; item: integer): OSErr;
  256.         var
  257.             dlg: DialogPtr;
  258.             err: OSErr;
  259.             font_setting: ICFontRecord;
  260.             old_font_setting: ICFontRecord;
  261.             attr: longint;
  262.             count: longint;
  263.             font: integer;
  264.     begin
  265.         dlg := windowinfo[wt].window;
  266.         GetCurrentSetting(dlg, item, font_setting, font);
  267.         (* get old values *)
  268.         count := sizeof(old_font_setting);
  269.         if (ICMapErr(ICGetPref(GetInstance, windowinfo[wt].items[item]^.key, attr, @old_font_setting, count)) <> noErr) | (count <> sizeof(old_font_setting)) then begin
  270.             old_font_setting.font := '';
  271.         end; (* if *)
  272.         (* write it back if changed *)
  273.         err := noErr;
  274.         if (old_font_setting.size <> font_setting.size) or (old_font_setting.face <> font_setting.face) or (IUEqualString(old_font_setting.font, font_setting.font) <> 0) then begin
  275.             if not IsLocked(wt, item) then begin
  276.                 err := ICMapErr(ICSetPref(GetInstance, windowinfo[wt].items[item]^.key, ICattr_no_change, @font_setting, sizeof(font_setting)));
  277.                 if err = noErr then begin
  278.                     DirtyDocument;
  279.                 end; (* if *)
  280.             end; (* if *)
  281.         end; (* if *)
  282.         WhatFlushFont := err;
  283.     end; (* WhatFlushFont *)
  284.  
  285. end. (* ICFontWhats *)
  286. AddResMenu(fontmenu, 'FONT');
  287. CalcMenuSize(fontmenu);
  288. SetCtlMax(GetDControlHandle(dlg, item), CountMItems(fontmenu));
  289. DebugStr(StringOf(fontmenu, CountMItems(fontmenu)));